﻿#region Copyright

// // The contents of this file are subject to the Mozilla Public License
// // Version 1.1 (the "License"); you may not use this file except in compliance
// // with the License. You may obtain a copy of the License at
// //   
// // http://www.mozilla.org/MPL/
// //   
// // Software distributed under the License is distributed on an "AS IS"
// // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// // License for the specific language governing rights and limitations under 
// // the License.
// //   
// // The Initial Developer of the Original Code is Robert Smyth.
// // Portions created by Robert Smyth are Copyright (C) 2008-2013.
// //   
// // All Rights Reserved.

#endregion

using NDependencyInjection.interfaces;
using NoeticTools.NWorkflow.Steps.Gates;


namespace NoeticTools.NWorkflow.Scopes
{
    public class InvokeThenScope<TResult, TStepResult, T> : ThenScope<T>
    {
        private readonly IStepRules<TStepResult> _rules;
        private readonly SynchronousActionGate<TResult> _synchronousActionGate;
        private readonly ISystemDefinition _system;
        private readonly IWorkflowRunner<TResult> _workflow;
        private readonly IWorkflowRules<TResult> _workflowRules;

        public InvokeThenScope(IWorkflowRules<TResult> workflowRules, IStepRules<TStepResult> rules, T inner, SynchronousActionGate<TResult> synchronousActionGate,
                               IWorkflowRunner<TResult> workflow, ISystemDefinition system) : base(inner)
        {
            _workflowRules = workflowRules;
            _rules = rules;
            _synchronousActionGate = synchronousActionGate;
            _workflow = workflow;
            _system = system;
        }

        public ActionScope<TResult, TStepResult> OnReturn()
        {
            return new ActionScope<TResult, TStepResult>(_workflowRules, _rules, _synchronousActionGate.AddOnReturnAction, _workflow, _system);
        }
    }
}